// =====================================================================================
// 
//       Filename:  Giocatore.hh
// 
//    Description:  Interfaccia della classe astratta Giocatore
// 
//         Author:  Davide Poletti , davide.pole@gmail.com
//					Paolo Pigato , p.pigato@hotmail.com	
//        Company:  P&P.cpp
// 
// =====================================================================================
#ifndef  GIOCATORE_INC
#define  GIOCATORE_INC

#include <utility>
#include <list>
#include <iostream>
using namespace std;
#include "Mare.hh"
#include "Nave.hh"
#include "Nave0.hh"
#include "Nave1.hh"
#include "Nave2.hh"
#include "Nave3.hh"
#include "Nave4.hh"
#include "Nave5.hh"

class Giocatore
{
    protected:
        Mare _mare_mio;
        Mare _mare_avv;
        list<Nave*> _navi_mie;
        Nave0* _nave_colpite;
        Nave0* _nave_affondate;

    public:
        Giocatore(int dim_mare);
        virtual ~Giocatore() {}

        bool sconfitto();

        //Ritorna la casella in cui il giocatore vuole sparare
        virtual pair<int,int> spara() = 0;    

        //Crea e posizona una nave di dimensione a piacere o fissata
        virtual int posiziona_nave() = 0;    
        virtual int posiziona_nave(int dim_nave) = 0; 

        //Crea la nave del tio corrispondente a "dim_nave"
        Nave* crea_nave(int dim_nave, pair<int, int> posizione, int orientamento);

        /* Comunica al proprio mare le coordiante del colpo avversario
         * e restituisce l'esito secondo la seguente codifica:
         * 0 = errore: si era già sparato nella casella
         * 1 = acqua
         * 2 = colpito
         * 3 = affondato
         * 4 = sconfitto
         */
        int subisci_sparo(pair<int, int> coor);

        //Metodi per la gestione della propria copia del mare avversario
        //Cambia in affondate la casella "coor" e tutte le adiacenti colpite 
        void affonda_nave(pair<int, int> coor);

        //Aggiorna "_mare_avv" alla luce di esito
        void aggiorna_con_esito(pair<int, int> colpo, int esito);


};  
#endif // ----- #ifndef GIOCATORE_INC  -----
